package com.text.util;

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.text.mapper.UserMapperPlus;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * MyBatis-Plus工具类
 * 提供支持MyBatis-Plus的SqlSession创建和管理
 */
public class MyBatisPlusUtil {

    private static SqlSessionFactory sqlSessionFactory;

    // 静态代码块，初始化SqlSessionFactory
    static {
        try {
            // 加载数据库配置
            Properties properties = new Properties();
            InputStream propStream = MyBatisPlusUtil.class.getClassLoader()
                    .getResourceAsStream("database.properties");
            if (propStream != null) {
                properties.load(propStream);
                propStream.close();
            }

            // 创建MyBatis-Plus配置
            MybatisConfiguration configuration = new MybatisConfiguration();
            configuration.setMapUnderscoreToCamelCase(true);
            configuration.setCacheEnabled(true);
            configuration.setLazyLoadingEnabled(true);
            configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);

            // 添加MyBatis-Plus拦截器（必须，否则BaseMapper无法工作）
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            // 可以添加分页插件等
            // interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            configuration.addInterceptor(interceptor);

            // 设置数据源
            org.apache.ibatis.mapping.Environment environment = new org.apache.ibatis.mapping.Environment(
                    "development",
                    new org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory(),
                    new org.apache.ibatis.datasource.unpooled.UnpooledDataSource(
                            properties.getProperty("db.driver"),
                            properties.getProperty("db.url"),
                            properties.getProperty("db.username"),
                            properties.getProperty("db.password")
                    )
            );
            configuration.setEnvironment(environment);

            // 创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

            // 创建GlobalConfig（必须，用于主键生成等）
            GlobalConfig globalConfig = new GlobalConfig();
            GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
            // 设置主键策略：AUTO（数据库自增）
            dbConfig.setIdType(com.baomidou.mybatisplus.annotation.IdType.AUTO);
            globalConfig.setDbConfig(dbConfig);

            // 通过反射设置GlobalConfig到Configuration中
            org.apache.ibatis.session.Configuration config = sqlSessionFactory.getConfiguration();
            if (config instanceof MybatisConfiguration) {
                MybatisConfiguration mybatisConfig = (MybatisConfiguration) config;
                try {
                    // 尝试使用反射设置GlobalConfig，尝试不同的字段名
                    java.lang.reflect.Field field = null;
                    String[] possibleFieldNames = {"globalConfig", "global", "mpGlobalConfig"};
                    for (String fieldName : possibleFieldNames) {
                        try {
                            field = MybatisConfiguration.class.getDeclaredField(fieldName);
                            break;
                        } catch (NoSuchFieldException e) {
                            // 继续尝试下一个字段名
                        }
                    }

                    if (field != null) {
                        field.setAccessible(true);
                        field.set(mybatisConfig, globalConfig);
                    } else {
                        // 如果找不到字段，尝试使用getGlobalConfig方法获取，然后设置
                        try {
                            java.lang.reflect.Method getMethod = MybatisConfiguration.class.getMethod("getGlobalConfig");
                            GlobalConfig existingConfig = (GlobalConfig) getMethod.invoke(mybatisConfig);
                            if (existingConfig != null) {
                                // 如果已存在，更新其配置
                                existingConfig.setDbConfig(dbConfig);
                            } else {
                                // 如果不存在，尝试通过setter方法设置
                                try {
                                    java.lang.reflect.Method setMethod = MybatisConfiguration.class.getMethod("setGlobalConfig", GlobalConfig.class);
                                    setMethod.invoke(mybatisConfig, globalConfig);
                                } catch (NoSuchMethodException e) {
                                    // 如果setter也不存在，尝试查找所有字段
                                    java.lang.reflect.Field[] fields = MybatisConfiguration.class.getDeclaredFields();
                                    for (java.lang.reflect.Field f : fields) {
                                        if (f.getType() == GlobalConfig.class) {
                                            f.setAccessible(true);
                                            f.set(mybatisConfig, globalConfig);
                                            break;
                                        }
                                    }
                                }
                            }
                        } catch (Exception e) {
                            // 如果所有方法都失败，尝试查找所有字段
                            java.lang.reflect.Field[] fields = MybatisConfiguration.class.getDeclaredFields();
                            for (java.lang.reflect.Field f : fields) {
                                if (f.getType() == GlobalConfig.class) {
                                    f.setAccessible(true);
                                    f.set(mybatisConfig, globalConfig);
                                    break;
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    // 如果反射失败，尝试在创建Configuration之前设置
                    // 或者直接使用默认的GlobalConfig
                    System.err.println("警告：无法设置GlobalConfig，将使用默认配置: " + e.getMessage());
                }
            }

            // 手动注册Mapper（避免使用需要Spring的包扫描）
            config.addMapper(UserMapperPlus.class);

            System.out.println("✅ MyBatis-Plus SqlSessionFactory 初始化成功！");

        } catch (IOException e) {
            throw new RuntimeException("MyBatis-Plus初始化失败", e);
        }
    }

    /**
     * 获取SqlSession（自动提交）
     * @return SqlSession对象
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true); // 自动提交
    }

    /**
     * 获取SqlSession
     * @param autoCommit 是否自动提交
     * @return SqlSession对象
     */
    public static SqlSession getSqlSession(boolean autoCommit) {
        return sqlSessionFactory.openSession(autoCommit);
    }

    /**
     * 关闭SqlSession
     * @param sqlSession SqlSession对象
     */
    public static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }

    /**
     * 获取SqlSessionFactory
     * @return SqlSessionFactory对象
     */
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}
